package com.syl.practice.datatype.string;

/**
 *  参考：https://blog.csdn.net/wo541075754/article/details/108374856?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161068738316780262542789%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fblog.%252522%25257D&request_id=161068738316780262542789&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-2-108374856.pc_v1_rank_blog_v1&utm_term=%E5%B8%B8%E9%87%8F%E6%B1%A0
 *
 *
 *  已经绕晕了！！！
 */
public class Demo01 {
    public static void main(String[] args) {
        // JVM编译时采用了StringBuilder进行加号的拼接，只会在堆中创建一个String对象，并不会在常量池中存储对应的字符串。
        // 此时字符串常量池没有"hello"， 令s1 = XXX
        String s1 = new String("he") + new String("llo");
        // JVM编译时采用了StringBuilder进行加号的拼接，只会在堆中创建一个String对象，并不会在常量池中存储对应的字符串。
        // 此时字符串常量池还是没有"hello"， 令s2 = YYY
        String s2 = new String("h") + new String("ello");

        // 将堆中字符串s1指向的对象"hello"池化，由于池中没有"hello",池中会存放引用地址XXX
        // 返回值s3为引用地址XXX
        String s3 = s1.intern();
        // 将堆中字符串s1指向的对象"hello"池化，此时常量池中已经有hello字符串，类型为引用且指向s1的地址
        // 返回值s4为引用地址XXX
        String s4 = s2.intern();
        System.out.println(s1 == s3); // true
        System.out.println(s1 == s4); // true
    }
}
